package com.buyman.server.controller;

import java.io.IOException;
import java.util.Date;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.Context;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

import com.buyman.server.bean.gp.Proveedor;
import com.buyman.server.bean.gp.Ubicacion;
import com.buyman.server.bean.us.Usuario;
import com.buyman.server.bean.us.UsuarioProveedorEstado;
import com.buyman.server.bo.IProveedorBO;
import com.buyman.server.bo.ISucesosBO;
import com.buyman.server.bo.IUsuarioBO;
import com.buyman.server.core.ImplementationFactory;
import com.buyman.server.helper.BuymanHelper;
import com.buyman.server.http.GeoCoderRequest;
import com.buyman.server.http.LocalizacionIPRequest;
import com.buyman.server.monitor.MonitorUsuariosLogueados;
import com.buyman.server.ms.ISucesos;
import com.buyman.server.ms.ManagerSucesos;
import com.buyman.server.util.AccessApplicationProperties;

public class SaveLoginController extends AbstractController{
	
	private IUsuarioBO usuarioBO;
	private IProveedorBO proveedorBO;
	
	protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse res) throws Exception {
		// TODO Auto-generated method stub
		String funcion = req.getParameter("funcion");
		if (funcion.equals("loguearUsuario"))
			this.loguearUsuario(req, res);
		else
			if (funcion.equals("desloguearUsuario"))
				this.desloguearUsuario(req);
			else
				if (funcion.equals("loginInicial"))
					this.loginInicial(req);
		return null;
	}
	
	private void loguearUsuario (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String mail = req.getParameter("mail");
		Usuario usuario = this.getUsuarioBO().getUsuarioByMail(mail);
		if (usuario!=null)
		{
			String pass = req.getParameter("pass");
			if (!pass.equals(""))
			{
				if (pass.equals(usuario.getPassword()))
				{
					req.getSession().setAttribute("idUsuario", usuario.getId());
					req.getSession().setAttribute("usuarioDesc", usuario.getNombre());
					req.getSession().setAttribute("frame", "jsp/homelogueado.jsp");
					res.getWriter().write("1");
				}
				else
				{
					res.getWriter().write("0");
					return;
				}
			}
			else
			{
				res.getWriter().write("0");
				return;
			}

			Long ubicacionIP = (Long)req.getSession().getAttribute( "ubicacionIP" );
			if( (ubicacionIP == null) || (ubicacionIP.equals( "" ) == true) )
			{
				String ip = "190.50.125.165"; // req.getRemoteAddr();
				Ubicacion ubicacion = LocalizacionIPRequest.getInstance().getUbicacion( ip );
				if( ubicacion != null )
				{
					req.getSession().setAttribute("ubicacionIP", ubicacion.getId());
					req.getSession().setAttribute("ubicacionIPDesc", ubicacion.getNombre());
					req.getSession().setAttribute("idUbicacion", ubicacion.getId());
					req.getSession().setAttribute("ubicacionDesc", ubicacion.getNombre());
					req.getSession().setAttribute("ciudad", ubicacion.getNombre());
					req.getSession().setAttribute("direccion", "");
					req.getSession().setAttribute("busquedaUbicacion", ubicacion.getNombre());
				}
				else
				{
					req.getSession().setAttribute("ubicacionIP", "-1");
					req.getSession().setAttribute("ubicacionIPDesc", "");
					req.getSession().setAttribute("idUbicacion", "");
					req.getSession().setAttribute("ciudad", "");
					req.getSession().setAttribute("direccion", "");
					req.getSession().setAttribute("ubicacionDesc", "");
					req.getSession().setAttribute("busquedaUbicacion", "");
				}
			}

			Ubicacion ubicacion = usuario.getUbicacion();
			if (ubicacion!=null)
			{
				if( (ubicacionIP == null) || (ubicacion.getId().equals( ubicacionIP ) == true) )
				{
					req.getSession().setAttribute("idUbicacion", ubicacion.getId());
					req.getSession().setAttribute("ubicacionDesc", ubicacion.getNombre());
					req.getSession().setAttribute("ciudad", ubicacion.getNombre());
					req.getSession().setAttribute("direccion", usuario.getDireccion());
					req.getSession().setAttribute("busquedaUbicacion", usuario.getDireccion() +", "+ ubicacion.getNombre());
				}
			}
			if( (usuario.getDireccion() != null) && (usuario.getDireccion().equals( "" ) != true) )
			{
				String direccion = usuario.getDireccion();
				if( ubicacion != null )
					direccion += ", "+ ubicacion.getNombre();
				JSONObject geocode = GeoCoderRequest.getInstance().solicitarGeoCoding( direccion );
				try
				{
					String latitud = geocode.getJSONObject( "location" ).getString( "lat" );
					String longitud = geocode.getJSONObject( "location" ).getString( "lng" );
					req.getSession().setAttribute("direccion.latitud", latitud);
					req.getSession().setAttribute("direccion.longitud", longitud);
				}
				catch(JSONException exc)
				{
					exc.printStackTrace();
				}
			}
		}
		else
		{
			res.getWriter().write("0");
			return;
		}
		
	}
	
	private void desloguearUsuario (HttpServletRequest req)
	{
		String idUsuario = req.getParameter("idUsuario");
		BuymanHelper.getInstance().desloguearUsuario(idUsuario);
		req.getSession().removeAttribute("idUsuario");
		req.getSession().removeAttribute("idProveedor");
		req.getSession().removeAttribute("idUbicacion");
		req.getSession().removeAttribute("ubicacionIP");
		req.getSession().removeAttribute("direccion.latitud");
		req.getSession().removeAttribute("direccion.longitud");
		req.getSession().removeAttribute("alertas");
		req.getSession().removeAttribute("tickets");
		req.getSession().setAttribute("frame", "jsp/home.jsp");
	}
	
	private void loginInicial (HttpServletRequest req) throws IOException
	{
		String pagina = req.getParameter("pagina");
		String idUsuario = req.getParameter("idUsuario");
		String idProveedor = req.getParameter("idProveedor");
		if (pagina.equals("homelogueado"))
			this.borrarEstadoActual(idUsuario);
		else
			if (pagina.equals("homeprovider"))
			{
				if (!idUsuario.equals(""))
				{
					Proveedor proveedor = this.getProveedorBO().getProveedorById(idProveedor);
					Usuario usuario = this.getUsuarioBO().getUsuarioById(idUsuario);
					ManagerSucesos.getInstance().crearSuceso(ISucesos.INGRESO_PROVEEDOR, usuario, proveedor);
				}
			}
	}
	
	private void borrarEstadoActual (String idUsuario)
	{
		Iterator<UsuarioProveedorEstado> itUpe = this.getUsuarioBO().getUsuarioProveedorEstadoConPedidosPendientes(idUsuario).iterator();
		while (itUpe.hasNext())
		{
			UsuarioProveedorEstado upe = itUpe.next();
			upe.setEstado("1");
			if (upe.getEnMostrador()!=null && upe.getEnMostrador())
				upe.setEnMostrador(new Boolean(false));
			this.getUsuarioBO().guardarUsuarioProveedorEstado(upe);
		}
		itUpe = this.getUsuarioBO().getUsuarioProveedorEstadoSinPedidosPendientes(idUsuario).iterator();
		while (itUpe.hasNext())
		{
			UsuarioProveedorEstado upe = itUpe.next();
			upe.setEstado(null);
			if (upe.getEnMostrador()!=null && upe.getEnMostrador())
				upe.setEnMostrador(new Boolean(false));
			this.getUsuarioBO().guardarUsuarioProveedorEstado(upe);
		}
		
	}

	public IUsuarioBO getUsuarioBO() {
		return usuarioBO;
	}

	public void setUsuarioBO(IUsuarioBO usuarioBO) {
		this.usuarioBO = usuarioBO;
	}

	public IProveedorBO getProveedorBO() {
		return proveedorBO;
	}

	public void setProveedorBO(IProveedorBO proveedorBO) {
		this.proveedorBO = proveedorBO;
	}

}
